home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / apps / opaste / opaste.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  5.1 KB  |  211 lines

  1. /*
  2.  * Copyright 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /*
  18.     opaste - Paste an image into the overlay or pup planes.
  19.  
  20.     Tim Heidmann, Silicon Graphics
  21.     December 7, 1992
  22. */
  23. #include <gl.h>
  24. #include <device.h>
  25. #include <gl/image.h>
  26. #include <stdio.h>
  27.  
  28. long mainMenu;
  29. int frameDetached, iconified, usePupPlanes, autoPop, canOverlay;
  30. long xorg, yorg, xsize, ysize;
  31. int useColor[][3] = {
  32.       0,   0,   0,
  33.       0,   0,   0,
  34.     128, 128, 128,
  35.     255, 255, 255
  36. };
  37.  
  38.  
  39. main(int argc, char *argv[]) {
  40.     unsigned short *buf, *p;
  41.     IMAGE *f;
  42.     int i, irow, icol, done, wid;
  43.     long xorg2, yorg2;
  44.     float update_rate = 5.0;
  45.     short dev, val;
  46.  
  47.     /* Parse arguments */
  48.     if (argc != 2) {
  49.     fprintf(stderr, "usage: %s <image file>\n", argv[0]);
  50.     exit(1);
  51.     }
  52.     if ((f = iopen(argv[1], "r")) == NULL) {
  53.     fprintf(stderr, "Can't open image file %s\n", argv[1]);
  54.     exit(1);
  55.     }
  56.     if (f->zsize != 1) {
  57.     fprintf(stderr,
  58.     "Warning: %s is not a single channel image.\n",
  59.     argv[1]);
  60.     }
  61.  
  62.     /* Open a window and get its location */
  63.     prefsize(xsize = f->xsize, ysize = f->ysize);
  64.     iconsize(100, 100);
  65.     wid = winopen(argv[1]);
  66.     getorigin(&xorg, &yorg);
  67.  
  68.     if (canOverlay) overlay(2);
  69.     gconfig();
  70.     color(BLACK);
  71.     clear();
  72.     frameDetached = FALSE;
  73.     iconified = FALSE;
  74.     autoPop = FALSE;
  75.     canOverlay = getgdesc(GD_BITS_OVER_SNG_CMODE) > 0;
  76.     usePupPlanes = !canOverlay;
  77.  
  78.     mainMenu = newpup();
  79.     MakeMenu();
  80.  
  81.     /* Read the image to be displayed.  Quantize if not a colormap image. */
  82.     buf = (unsigned short *) malloc(f->xsize * f->ysize * sizeof(short));
  83.     for (irow = 0, p = buf; irow < f->ysize; irow++) {
  84.     getrow(f, p, irow, 0);
  85.     if (f->colormap != CM_SCREEN)
  86.         for (icol = 0; icol < f->xsize; icol++, p++) *p >>= 6;
  87.     else
  88.         p += f->xsize;
  89.     }
  90.     iclose(f);
  91.  
  92.     /* All these devices are needed to manage iconifying and closing right. */
  93.     qdevice(DEPTHCHANGE);
  94.     qdevice(REDRAW);
  95.     qdevice(REDRAWICONIC);
  96.     qdevice(WINSHUT);
  97.     qdevice(WINQUIT);
  98.     qdevice(WINFREEZE);
  99.     qdevice(WINTHAW);
  100.     qdevice(ESCKEY);
  101.     qdevice(RIGHTMOUSE);
  102.     qdevice(TIMER1);
  103.     noise(TIMER1, (int)(update_rate * getgdesc(GD_TIMERHZ)));
  104.  
  105.     qenter(TIMER1, 0);
  106.     for (done = FALSE; !done; ) {
  107.     switch (dev = qread(&val)) {
  108.     case WINFREEZE:
  109.     case WINTHAW:
  110.         break;
  111.  
  112.     case ESCKEY:
  113.     case WINSHUT:
  114.     case WINQUIT:
  115.         done = TRUE; break;
  116.  
  117.     case REDRAW:
  118.         iconified = FALSE;
  119.         reshapeviewport();
  120.         if (!frameDetached) {
  121.         getorigin(&xorg2, &yorg2);
  122.         if (xorg2 != xorg || yorg2 != yorg) {
  123.             ClearRect();
  124.             xorg = xorg2; yorg = yorg2;
  125.         }
  126.         }
  127.         color(BLACK);
  128.         clear();
  129.         qenter(TIMER1, 0);
  130.         break;
  131.  
  132.     case REDRAWICONIC:
  133.         iconified = TRUE;
  134.         color(BLACK);
  135.         clear();
  136.         if (!frameDetached) ClearRect();
  137.         break;
  138.  
  139.     case RIGHTMOUSE:
  140.         if (!val) break;
  141.         switch (dopup(mainMenu)) {
  142.         case 1: /* Hide/Show window frame */
  143.         if (frameDetached) {
  144.             prefposition(xorg, xorg+xsize-1, yorg, yorg+ysize-1);
  145.             winconstraints();
  146.             winpop();
  147.             frameDetached = FALSE;
  148.         } else {
  149.             winconstraints();
  150.             frameDetached = TRUE;
  151.         }
  152.         MakeMenu();
  153.         break;
  154.         case 2: /* Toggle bitplanes - PopUp/Overlay */
  155.         ClearRect();
  156.         usePupPlanes = !usePupPlanes;
  157.         qenter(TIMER1, 0); /* Schedule redraw */
  158.         MakeMenu();
  159.         break;
  160.         case 3: /* Toggle automatic pop window to front */
  161.         autoPop = !autoPop;
  162.         MakeMenu();
  163.         break;
  164.         case 99: /* Exit */
  165.         done = TRUE;
  166.         break;
  167.         default:
  168.         break;
  169.         }
  170.         break;
  171.  
  172.     case TIMER1:
  173.         if (autoPop) winpop();
  174.     case DEPTHCHANGE:
  175.         if (iconified && !frameDetached) break;
  176.         drawmode(usePupPlanes ? PUPDRAW : OVERDRAW);
  177.         fullscrn();
  178.         for (i=1; i<4; i++)
  179.         mapcolor(i, useColor[i][0], useColor[i][1], useColor[i][2]);
  180.         rectwrite(xorg, yorg, xorg+xsize-1, yorg+ysize-1, buf);
  181.         endfullscrn();
  182.         drawmode(NORMALDRAW);
  183.         break;
  184.  
  185.     default:
  186.         break;
  187.     }
  188.     }
  189.  
  190.     ClearRect();
  191. }
  192.  
  193. MakeMenu() {
  194.     freepup(mainMenu);
  195.     mainMenu = defpup( "Overlay Paste%t");
  196.     addtopup(mainMenu, frameDetached ? "Attach Frame%x1" : "Detach Frame%x1");
  197.     if (canOverlay)
  198.     addtopup(mainMenu, usePupPlanes ? "Use Overlay%x2" : "Use Popup%x2");
  199.     addtopup(mainMenu, autoPop ? "Don't Auto Pop%x3%l" : "Auto Pop%l%x3");
  200.     addtopup(mainMenu, "Quit %x99");
  201. }
  202.  
  203. ClearRect() {
  204.     drawmode(usePupPlanes ? PUPDRAW : OVERDRAW);
  205.     fullscrn();
  206.     color(0);
  207.     rectfi(xorg, yorg, xorg+xsize-1, yorg+ysize-1);
  208.     endfullscrn();
  209.     drawmode(NORMALDRAW);
  210. }
  211.